﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Xml.Linq;
using Fuyao.Business.Entities.Models;

namespace Fuyao.Data.SQLServer.DAO
{
    public class DAOGuiaInterna
    {
        string strCnx = clsConexionDB.getConexionSQL();

        public int InsertGuiaInterna(Pedido oNewPedido)
        {
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            int result = 0;
            try
            {
                strCommand.Append("FYAO_InsertGuiaInterna");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;
                //--------------------PARAMETROS CLIENTE
                sqlCommand.Parameters.Add("@ClienteID", SqlDbType.Int).Value = oNewPedido.ClienteID;
                /*sqlCommand.Parameters.Add("@NombreCliente", SqlDbType.VarChar, 100).Value = oNewPedido.NombreCliente;
                sqlCommand.Parameters.Add("@Telefono", SqlDbType.VarChar, 10).Value = oNewPedido.TelefonoCliente;
                sqlCommand.Parameters.Add("@Direccion", SqlDbType.VarChar, 50).Value = oNewPedido.DireccionCliente;
                sqlCommand.Parameters.Add("@DNI", SqlDbType.VarChar, 10).Value = oNewPedido.DniCliente;
                sqlCommand.Parameters.Add("@RUC", SqlDbType.VarChar, 11).Value = oNewPedido.RucCliente;*/
                sqlCommand.Parameters.Add("@CreadoPor", SqlDbType.Int).Value = oNewPedido.CreadoPor;
                //--------------------PARAMETROS PEDIDO
                sqlCommand.Parameters.Add("@NroPedido", SqlDbType.VarChar, 20).Value = oNewPedido.NroPedido;
                sqlCommand.Parameters.Add("@ManejadoPor", SqlDbType.VarChar,50).Value = oNewPedido.ManejadoPor;
                sqlCommand.Parameters.Add("@Observacion", SqlDbType.VarChar, 200).Value = oNewPedido.Observacion;
                //--------------------PARAMETROS DETALLE PEDIDO
                sqlCommand.Parameters.Add("@XML", SqlDbType.Xml).Value = getItemLinqXML_InsertDetallePedido(oNewPedido.DetallePedidos);
                cnx.Open();
                result = Convert.ToInt32(sqlCommand.ExecuteScalar());
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return result;
        }

        public Pedido getGuiaInternaByNroPedido(string nroPedido)
        {

            Pedido oPedido = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("select Ped.PedidoID,Ped.NroPedido,right('000000' + cast(Ped.NroPedido as varchar(6)), 6) NroPedidoDesc,Ped.ClienteID,Cli.NombreCliente,Ped.FechaCreacion,Ped.ManejadoPor,Ped.Estado,Ped.Observacion, ");
                strCommand.Append("Cli.DNI, Cli.RUC, Dir.Direccion,Cli.Telefono, Cli.VendedorID,Dpto.Departamento,Prv.Provincia,Dst.Distrito from dbo.Pedido Ped inner join dbo.Cliente Cli on Ped.ClienteID = Cli.ClienteID  ");
                strCommand.Append("inner join Direccion Dir on (Cli.ClienteID=Dir.ClienteID and Dir.EsPrincipal=1) " );
                strCommand.Append("inner join Departamento Dpto on Dir.DepartamentoID=Dpto.DepartamentoID ");
                strCommand.Append("inner join Provincia Prv on Dir.ProvinciaID=Prv.ProvinciaID ");
                strCommand.Append("inner join Distrito Dst on Dir.DistritoID=Dst.DistritoID ");
                strCommand.Append("where Ped.NroPedido = @nroPedido  ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                sqlCommand.Parameters.Add("@nroPedido", SqlDbType.VarChar, 20).Value = nroPedido;


                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oPedido = new Pedido();
                    oPedido.Cliente = new Cliente();

                    if (!Convert.IsDBNull(dr["PedidoID"])) oPedido.PedidoID = Convert.ToInt32(dr["PedidoID"]);
                    if (!Convert.IsDBNull(dr["NroPedido"])) oPedido.NroPedido = Convert.ToInt32(dr["NroPedido"]);
                    if (!Convert.IsDBNull(dr["NroPedidoDesc"])) oPedido.NroPedidoDesc = Convert.ToString(dr["NroPedidoDesc"]);
                    if (!Convert.IsDBNull(dr["ClienteID"])) oPedido.ClienteID = Convert.ToInt32(dr["ClienteID"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oPedido.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oPedido.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["ManejadoPor"])) oPedido.ManejadoPor = Convert.ToString(dr["ManejadoPor"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oPedido.Estado = Convert.ToInt32(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["Observacion"])) oPedido.Observacion = Convert.ToString(dr["Observacion"]);
                    if (!Convert.IsDBNull(dr["DNI"])) oPedido.Cliente.DNI = Convert.ToString(dr["DNI"]);
                    if (!Convert.IsDBNull(dr["RUC"])) oPedido.Cliente.RUC = Convert.ToString(dr["RUC"]);
                    if (!Convert.IsDBNull(dr["Direccion"])) oPedido.Cliente.DireccionDesc = Convert.ToString(dr["Direccion"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oPedido.Cliente.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oPedido.Cliente.Telefono = Convert.ToString(dr["Telefono"]);
                    if (!Convert.IsDBNull(dr["VendedorID"])) oPedido.Cliente.VendedorID = Convert.ToInt32(dr["VendedorID"]);
                    if (!Convert.IsDBNull(dr["Departamento"])) oPedido.Cliente.DepartamentoDesc = Convert.ToString(dr["Departamento"]);
                    if (!Convert.IsDBNull(dr["Provincia"])) oPedido.Cliente.ProvinciaDesc = Convert.ToString(dr["Provincia"]);
                    if (!Convert.IsDBNull(dr["Distrito"])) oPedido.Cliente.DistritoDesc = Convert.ToString(dr["Distrito"]);                    
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oPedido;
        }

        public string getNumeroGuia(string NroGuia)
        {
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            string result = string.Empty;
            try
            {
                strCommand.Append("select right('000000' + cast(isnull(Valor,1) as varchar(6)), 6) from Parametro where Nombre=@ColumNombre ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;
                //--------------------PARAMETROS CLIENTE
                sqlCommand.Parameters.Add("@ColumNombre", SqlDbType.VarChar, 50).Value = NroGuia;
                cnx.Open();
                result = Convert.ToString(sqlCommand.ExecuteScalar());
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return result;
        }

        public List<Pedido> getAllGuiaInternaByFilter(Pedido BE)
        {

            Pedido oPedido = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<Pedido> listPedidos = new List<Pedido>();

            try
            {
                strCommand.Append("FYAO_getGuiaInternaByFiler");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@NroGuia", SqlDbType.VarChar, 6).Value = BE.NroPedido;
                sqlCommand.Parameters.Add("@Cliente", SqlDbType.VarChar, 100).Value = BE.NombreCliente;
                sqlCommand.Parameters.Add("@VendedorID", SqlDbType.Int).Value = BE.VendedorId;
                sqlCommand.Parameters.Add("@DateIni", SqlDbType.DateTime).Value = BE.FechaCreacion;
                sqlCommand.Parameters.Add("@DateFin", SqlDbType.DateTime).Value = BE.FechaDesde;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Int).Value = BE.Estado;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oPedido = new Pedido();
                    if (!Convert.IsDBNull(dr["PedidoID"])) oPedido.PedidoID = Convert.ToInt32(dr["PedidoID"]);
                    if (!Convert.IsDBNull(dr["NroPedido"])) oPedido.NroPedido = Convert.ToInt32(dr["NroPedido"]);
                    if (!Convert.IsDBNull(dr["NroPedidoDesc"])) oPedido.NroPedidoDesc = Convert.ToString(dr["NroPedidoDesc"]);
                    if (!Convert.IsDBNull(dr["ClienteID"])) oPedido.ClienteID = Convert.ToInt32(dr["ClienteID"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oPedido.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["Vendedor"])) oPedido.VendedorNombre = Convert.ToString(dr["Vendedor"]);
                    if (!Convert.IsDBNull(dr["FechaCreacion"])) oPedido.FechaCreacion = Convert.ToDateTime(dr["FechaCreacion"]);
                    if (!Convert.IsDBNull(dr["ManejadoPor"])) oPedido.ManejadoPor = Convert.ToString(dr["ManejadoPor"]);
                    if (!Convert.IsDBNull(dr["Total"])) oPedido.Total = Convert.ToDouble(dr["Total"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oPedido.Estado = Convert.ToInt32(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["DescEstado"])) oPedido.DescEstado = Convert.ToString(dr["DescEstado"]);
                    if (!Convert.IsDBNull(dr["Observacion"])) oPedido.Observacion = Convert.ToString(dr["Observacion"]);
                    if (!Convert.IsDBNull(dr["DNI"])) oPedido.DniCliente = Convert.ToString(dr["DNI"]);
                    if (!Convert.IsDBNull(dr["RUC"])) oPedido.RucCliente = Convert.ToString(dr["RUC"]);
                    if (!Convert.IsDBNull(dr["Direccion"])) oPedido.DireccionCliente = Convert.ToString(dr["Direccion"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oPedido.TelefonoCliente = Convert.ToString(dr["Telefono"]);
                    listPedidos.Add(oPedido);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listPedidos;
        }

        public Pedido getGuiaInternaByPedidoID(int PedidoID)
        {

            Pedido oPedido = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
       
            try
            {
                strCommand.Append("SELECT Ped.PedidoID,Ped.ClienteID,Cli.NombreCliente,isnull(Cli.RUC,'') RUC,isnull(Cli.DNI,'') DNI,Dir.Direccion,Cli.Telefono,Ped.NroPedido,right('000000' + cast(Ped.NroPedido as varchar(6)), 6) NroPedidoDesc,Ped.ManejadoPor,Ped.Estado,Ped.Observacion  ");
                strCommand.Append("FROM   Pedido Ped inner join Cliente Cli on Ped.ClienteID=Cli.ClienteID inner join Direccion Dir on (Cli.ClienteID=Dir.ClienteID and Dir.EsPrincipal=1)  ");
                strCommand.Append("where  Ped.PedidoID=@PedidoID  ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                sqlCommand.Parameters.Add("@PedidoID", SqlDbType.Int).Value = PedidoID;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oPedido = new Pedido();
                    if (!Convert.IsDBNull(dr["PedidoID"])) oPedido.PedidoID = Convert.ToInt32(dr["PedidoID"]);
                    if (!Convert.IsDBNull(dr["ClienteID"])) oPedido.ClienteID = Convert.ToInt32(dr["ClienteID"]);
                    if (!Convert.IsDBNull(dr["NombreCliente"])) oPedido.NombreCliente = Convert.ToString(dr["NombreCliente"]);
                    if (!Convert.IsDBNull(dr["RUC"])) oPedido.RucCliente = Convert.ToString(dr["RUC"]);
                    if (!Convert.IsDBNull(dr["DNI"])) oPedido.DniCliente = Convert.ToString(dr["DNI"]);
                    if (!Convert.IsDBNull(dr["Direccion"])) oPedido.DireccionCliente = Convert.ToString(dr["Direccion"]);
                    if (!Convert.IsDBNull(dr["Telefono"])) oPedido.TelefonoCliente = Convert.ToString(dr["Telefono"]);
                    if (!Convert.IsDBNull(dr["NroPedido"])) oPedido.NroPedido = Convert.ToInt32(dr["NroPedido"]);
                    if (!Convert.IsDBNull(dr["NroPedidoDesc"])) oPedido.NroPedidoDesc = Convert.ToString(dr["NroPedidoDesc"]);
                    if (!Convert.IsDBNull(dr["ManejadoPor"])) oPedido.ManejadoPor = Convert.ToString(dr["ManejadoPor"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oPedido.Estado = Convert.ToInt32(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["Observacion"])) oPedido.Observacion = Convert.ToString(dr["Observacion"]);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oPedido;
        }

        public List<DetallePedido> getAllDetallePedidoByPedidoID(int PedidoID)
        {

            DetallePedido oDetallePedido = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<DetallePedido> listDetallePedido = new List<DetallePedido>();

            try
            {
                strCommand.Append("select Dp.PedidoID,Dp.ProductoID,Prod.CodigoProducto,Prod.DescripcionProducto,isnull(Dp.Cantidad,0) Cantidad,isnull(Dp.PrecioUnitario,0) PrecioUnitario,isnull(Dp.PrecioUnitario,0)*isnull(Dp.Cantidad,0) Importe ");
                strCommand.Append("from  DetallePedido Dp inner join Producto Prod on Dp.ProductoID=Prod.ProductoID where  Dp.PedidoID=@PedidoID ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                sqlCommand.Parameters.Add("@PedidoID", SqlDbType.Int).Value = PedidoID;
                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oDetallePedido = new DetallePedido();
                    if (!Convert.IsDBNull(dr["PedidoID"])) oDetallePedido.PedidoID = Convert.ToInt32(dr["PedidoID"]);
                    if (!Convert.IsDBNull(dr["ProductoID"])) oDetallePedido.ProductoID = Convert.ToInt32(dr["ProductoID"]);
                    if (!Convert.IsDBNull(dr["CodigoProducto"])) oDetallePedido.CodigoProducto = Convert.ToString(dr["CodigoProducto"]);
                    if (!Convert.IsDBNull(dr["DescripcionProducto"])) oDetallePedido.DescripcionProducto = Convert.ToString(dr["DescripcionProducto"]);
                    if (!Convert.IsDBNull(dr["Cantidad"])) oDetallePedido.Cantidad = Convert.ToInt32(dr["Cantidad"]);
                    if (!Convert.IsDBNull(dr["PrecioUnitario"])) oDetallePedido.PrecioUnitario = Convert.ToDecimal(dr["PrecioUnitario"]);
                    if (!Convert.IsDBNull(dr["Importe"])) oDetallePedido.Importe = Convert.ToDecimal(dr["Importe"]);
                    listDetallePedido.Add(oDetallePedido);
                }
                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listDetallePedido;
        }

        private string getItemLinqXML_InsertDetallePedido(ICollection<DetallePedido> listDetallePedido)
        {
            var xEle = new XElement("ITEMS",//raiz
                            from item in listDetallePedido
                            select new XElement("ITEM",//nodo                                    
                                   new XAttribute("ProductoID", item.ProductoID),
                                   new XAttribute("Cantidad", item.Cantidad),
                                   new XAttribute("PrecioUnitario", item.PrecioUnitario)
                                   )); 
            return xEle.ToString();
        }       

        public bool UpdateEstadoGuiaInterna(int PedidoId, int estado,int userModify)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Pedido set Estado=@Estado, FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE PedidoID = @PedidoID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@PedidoID", SqlDbType.Int).Value = PedidoId;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Int).Value = estado;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = userModify;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }
    }
}
